package cn.itsource.itsource.config.quartz;


import cn.itsource.itsource.job.DingDanChaoShi;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Configuration
public class QuartzConfiguration {
    // 读取application.yml配置文件中的参数
    @Value("${quartz.myjobTime}")
    private String myjobTime;
    @Value("${quartz.mySecondjobTime}")
    private String mySecondjobTime;

    //是否进行 并发执行
    private static boolean isConcurrent = true;

    /*
        规律:
            每一个定时任务，在配置时，都会有一个对应的trigger:触发器
            即：每一个JobDetail就会有一个配套的Trigger

            结论：
                1.每个jobdetail都会有一个对应的trigger
                    jobdetail：执行具体的定时任务
                    trigger：设置定时的时间
                        cron:设置定时时间的具体语法

                2.在配置job和trigger时，注意：trigger中引用的参数Jobdetail对象是根据参数名称来查找他对应的job
     */
    @Bean(name = "dingDanChaoShiJobDetail")
    public MethodInvokingJobDetailFactoryBean myJobDetail(DingDanChaoShi dingDanChaoShi) {
        MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
        // 是否并发执行
        jobDetail.setConcurrent(isConcurrent);
        // 为需要执行的实体类设置具体任务的对象
        jobDetail.setTargetObject(dingDanChaoShi);
        // 需要执行的方法
        jobDetail.setTargetMethod("execute");
        return jobDetail;
    }

    /*
        1. 参数中引用的对象类型，它是一个jobDetail中的实现类
        2. 这个实现类，并不是自己创建的，理解为由spring容器进行的赋值。即@autowired功能类似

     */
    @Bean(name = "dingDanChaoShiTrigger")
    public CronTriggerFactoryBean myJobTrigger(JobDetail dingDanChaoShiJobDetail) {
        CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
        trigger.setJobDetail(dingDanChaoShiJobDetail);
        // cron表达式
        trigger.setCronExpression(myjobTime);
        return trigger;
    }

    // 配置Scheduler
    @Bean(name = "scheduler")
    public SchedulerFactoryBean schedulerFactory(
            Trigger dingDanChaoShiTrigger) {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        // 延时启动，应用启动1秒后
        bean.setStartupDelay(1);
        // 注册触发器
        bean.setTriggers(dingDanChaoShiTrigger);
        return bean;
    }
}
